package com.meihuayishu.backend.repository;

import com.meihuayishu.backend.entity.DivinationFeedback;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 占卜反馈数据访问接口
 */
@Repository
public interface FeedbackRepository extends JpaRepository<DivinationFeedback, Long> {
    
    /**
     * 根据用户ID查询反馈，按创建时间降序排序
     * @param userId 用户ID
     * @return 反馈列表
     */
    List<DivinationFeedback> findByUserIdOrderByCreatedAtDesc(Long userId);
    
    /**
     * 查询所有不同的原始卦象
     * @return 原始卦象列表
     */
    @Query("SELECT DISTINCT f.originalHexagram FROM DivinationFeedback f WHERE f.originalHexagram IS NOT NULL")
    List<String> findDistinctOriginalHexagram();
    
    /**
     * 查询所有不同的用户城市
     * @return 用户城市列表
     */
    @Query("SELECT DISTINCT f.userCity FROM DivinationFeedback f WHERE f.userCity IS NOT NULL")
    List<String> findDistinctUserCity();
    
    /**
     * 查询所有不同的用户心情
     * @return 用户心情列表
     */
    @Query("SELECT DISTINCT f.userMood FROM DivinationFeedback f WHERE f.userMood IS NOT NULL")
    List<String> findDistinctUserMood();
    
    /**
     * 统计指定卦象的反馈数量
     * @param originalHexagram 原始卦象
     * @return 反馈数量
     */
    long countByOriginalHexagram(String originalHexagram);
    
    /**
     * 统计指定卦象且准确性为指定值的反馈数量
     * @param originalHexagram 原始卦象
     * @param isAccurate 是否准确
     * @return 反馈数量
     */
    long countByOriginalHexagramAndIsAccurate(String originalHexagram, Boolean isAccurate);
    
    /**
     * 统计指定城市的反馈数量
     * @param userCity 用户城市
     * @return 反馈数量
     */
    long countByUserCity(String userCity);
    
    /**
     * 统计指定城市且准确性为指定值的反馈数量
     * @param userCity 用户城市
     * @param isAccurate 是否准确
     * @return 反馈数量
     */
    long countByUserCityAndIsAccurate(String userCity, Boolean isAccurate);
    
    /**
     * 统计指定心情的反馈数量
     * @param userMood 用户心情
     * @return 反馈数量
     */
    long countByUserMood(String userMood);
    
    /**
     * 统计指定心情且准确性为指定值的反馈数量
     * @param userMood 用户心情
     * @param isAccurate 是否准确
     * @return 反馈数量
     */
    long countByUserMoodAndIsAccurate(String userMood, Boolean isAccurate);
    
    /**
     * 统计指定用户的反馈数量
     * @param userId 用户ID
     * @return 反馈数量
     */
    long countByUserId(Long userId);
    
    /**
     * 统计指定用户且准确性为指定值的反馈数量
     * @param userId 用户ID
     * @param isAccurate 是否准确
     * @return 反馈数量
     */
    long countByUserIdAndIsAccurate(Long userId, Boolean isAccurate);
    
    /**
     * 查询指定城市和卦象的反馈
     * @param userCity 用户城市
     * @param originalHexagram 原始卦象
     * @return 反馈列表
     */
    List<DivinationFeedback> findByUserCityAndOriginalHexagram(String userCity, String originalHexagram);
    
    /**
     * 计算指定用户的准确率
     * @param userId 用户ID
     * @return 准确率（0.0-1.0），如果没有反馈则返回null
     */
    @Query("SELECT CASE WHEN COUNT(f) > 0 THEN " +
           "CAST(SUM(CASE WHEN f.isAccurate = true THEN 1 ELSE 0 END) AS double) / COUNT(f) " +
           "ELSE NULL END " +
           "FROM DivinationFeedback f WHERE f.userId = :userId")
    Double calculateUserAccuracyRate(Long userId);
    
    /**
     * 统计指定心情和卦象的反馈数量
     * @param userMood 用户心情
     * @param originalHexagram 原始卦象
     * @return 反馈数量
     */
    long countByUserMoodAndOriginalHexagram(String userMood, String originalHexagram);
    
    /**
     * 统计指定心情、卦象且准确性为指定值的反馈数量
     * @param userMood 用户心情
     * @param originalHexagram 原始卦象
     * @param isAccurate 是否准确
     * @return 反馈数量
     */
    long countByUserMoodAndOriginalHexagramAndIsAccurate(String userMood, String originalHexagram, Boolean isAccurate);
    
    /**
     * 根据用户ID查询反馈（兼容测试用例）
     * @param userId 用户ID
     * @return 反馈列表
     */
    List<DivinationFeedback> findByUserId(long userId);
    
    /**
     * 根据创建时间查询反馈
     * @param createdAt 创建时间
     * @return 反馈列表
     */
    List<DivinationFeedback> findByCreatedAtAfter(LocalDateTime createdAt);
    
    /**
     * 计算所有卦象的准确率
     * @return 卦象准确率映射
     */
    @Query("SELECT f.originalHexagram as hexagram, " +
           "CASE WHEN COUNT(f) > 0 THEN " +
           "CAST(SUM(CASE WHEN f.isAccurate = true THEN 1 ELSE 0 END) AS double) / COUNT(f) " +
           "ELSE 0.0 END as accuracyRate " +
           "FROM DivinationFeedback f " +
           "WHERE f.originalHexagram IS NOT NULL " +
           "GROUP BY f.originalHexagram")
    List<Object[]> calculateHexagramAccuracyRates();
    
    /**
     * 计算所有城市的准确率
     * @return 城市准确率映射
     */
    @Query("SELECT f.userCity as city, " +
           "CASE WHEN COUNT(f) > 0 THEN " +
           "CAST(SUM(CASE WHEN f.isAccurate = true THEN 1 ELSE 0 END) AS double) / COUNT(f) " +
           "ELSE 0.0 END as accuracyRate " +
           "FROM DivinationFeedback f " +
           "WHERE f.userCity IS NOT NULL " +
           "GROUP BY f.userCity")
    List<Object[]> calculateCityAccuracyRates();
    
    /**
     * 计算所有心情的准确率
     * @return 心情准确率映射
     */
    @Query("SELECT f.userMood as mood, " +
           "CASE WHEN COUNT(f) > 0 THEN " +
           "CAST(SUM(CASE WHEN f.isAccurate = true THEN 1 ELSE 0 END) AS double) / COUNT(f) " +
           "ELSE 0.0 END as accuracyRate " +
           "FROM DivinationFeedback f " +
           "WHERE f.userMood IS NOT NULL " +
           "GROUP BY f.userMood")
    List<Object[]> calculateMoodAccuracyRates();
}